home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / proc / proc.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  13KB  |  329 lines

  1. /*
  2.  * proc.h --
  3.  *
  4.  *    External declarations of routines 
  5.  *    for managing processes.
  6.  *
  7.  * Copyright 1986, 1988 Regents of the University of California
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  *
  16.  *
  17.  * rcsid $Header: /cdrom/src/kernel/Cvsroot/kernel/proc/proc.h,v 9.26 92/01/06 15:03:43 kupfer Exp $ SPRITE (Berkeley)
  18.  */
  19.  
  20. #ifndef _PROC
  21. #define _PROC
  22.  
  23. #ifdef KERNEL
  24. #include <procTypes.h>
  25. #include <user/sync.h>
  26. #include <syncLock.h>
  27. #include <list.h>
  28. #include <timer.h>
  29. #include <sig.h>
  30. #include <mach.h>
  31. #include <sysSysCallParam.h>
  32. #include <rpc.h>
  33. #else
  34. #include <kernel/procTypes.h>
  35. #include <sync.h>
  36. #include <kernel/syncLock.h>
  37. #include <list.h>
  38. #include <kernel/timer.h>
  39. #include <kernel/sig.h>
  40. #include <kernel/mach.h>
  41. #include <kernel/sysSysCallParam.h>
  42. #include <kernel/rpc.h>
  43. #endif /* */
  44.  
  45. /*
  46.  *  proc_RunningProcesses points to an array of pointers to
  47.  *  Proc_ControlBlock structures of processes currently running on each
  48.  *  CPU.  It is initialized by Proc_Init at boot time to the appropriate
  49.  *  size, which depends on the workstation configuration.
  50.  */
  51.  
  52. extern Proc_ControlBlock  **proc_RunningProcesses;
  53.  
  54.  
  55. /*
  56.  *  proc_PCBTable is the array of all valid PCB's in the system.
  57.  *  It is initialized by Proc_Init at boot time to the appropriate size,
  58.  *  which depends on the workstation configuration.
  59.  */
  60.  
  61. extern Proc_ControlBlock **proc_PCBTable;
  62.  
  63.  
  64. /*
  65.  *   Keep track of the maximum number of processes at any given time.
  66.  */
  67.  
  68. extern int proc_MaxNumProcesses;
  69.  
  70. /*
  71.  * set to TRUE to disallow all migrations to this machine.
  72.  */
  73. extern Boolean proc_RefuseMigrations;
  74.  
  75. /*
  76.  *  Macros to manipulate process IDs.
  77.  */
  78.  
  79. #define Proc_ComparePIDs(p1, p2) ((p1) == (p2))
  80.  
  81. #define Proc_GetPCB(pid) (proc_PCBTable[(pid) & PROC_INDEX_MASK])
  82.  
  83. #define Proc_ValidatePID(pid) \
  84.     ((((pid) & PROC_INDEX_MASK) < proc_MaxNumProcesses) && \
  85.      (((pid) == proc_PCBTable[(pid) & PROC_INDEX_MASK]->processID)))
  86.  
  87. #define PROC_GET_VALID_PCB(pid, procPtr) \
  88.     if (((pid) & PROC_INDEX_MASK) >= proc_MaxNumProcesses) { \
  89.     procPtr = (Proc_ControlBlock *) NIL; \
  90.     } else { \
  91.     procPtr = proc_PCBTable[(pid) & PROC_INDEX_MASK]; \
  92.     if ((pid) != (procPtr)->processID) { \
  93.         procPtr = (Proc_ControlBlock *) NIL; \
  94.     } \
  95.     }
  96.  
  97. #define    Proc_GetHostID(pid) (((pid) & PROC_ID_NUM_MASK) >> PROC_ID_NUM_SHIFT)
  98.  
  99. /*
  100.  * Macros to determine and set the "actual" currently running process.
  101.  */
  102.  
  103. #define    Proc_GetActualProc() \
  104.     proc_RunningProcesses[Mach_GetProcessorNumber()]
  105. #define Proc_SetActualProc(processPtr) \
  106.     proc_RunningProcesses[Mach_GetProcessorNumber()] = (processPtr)
  107.  
  108. #define Proc_GetCurrentProc() Proc_GetActualProc()
  109. #define Proc_SetCurrentProc(processPtr)    Proc_SetActualProc(processPtr)
  110.  
  111. /*
  112.  * Various routines use Proc_UseRpcBuffer to decide whether to copy 
  113.  * to/from user address space or kernel address space.  A common 
  114.  * example of using a kernel (RPC) buffer is when a migrated process 
  115.  * invokes a system call that is forwarded home.
  116.  * This macro bypasses Proc_GetEffectiveProc, since
  117.  * proc_RunningProcesses[processor] must be non-NIL.
  118.  */
  119.  
  120. #define    Proc_UseRpcBuffer() \
  121.     (proc_RunningProcesses[Mach_GetProcessorNumber()]->rpcClientProcess != \
  122.         ((Proc_ControlBlock *) NIL))
  123.  
  124. /*
  125.  * Used to get the lock at the top of the lock stack without popping it off.
  126.  */
  127. #define Proc_GetCurrentLock(pcbPtr, typePtr, lockPtrPtr) \
  128.     { \
  129.     if ((pcbPtr)->lockStackSize <= 0) { \
  130.         *(typePtr) = -1; \
  131.         *(lockPtrPtr) = (Address) NIL; \
  132.     } else { \
  133.         *(typePtr) = (pcbPtr)->lockStack[(pcbPtr)->lockStackSize-1].type; \
  134.         *(lockPtrPtr) = \
  135.         (pcbPtr)->lockStack[(pcbPtr)->lockStackSize-1].lockPtr; \
  136.     } \
  137.     }
  138. /* 
  139.  * External procedures.
  140.  */
  141.  
  142. extern ReturnStatus     Proc_ByteCopy _ARGS_((Boolean copyIn, int numBytes,
  143.                 Address sourcePtr, Address destPtr));
  144. extern void        Proc_CallFunc _ARGS_((void (*func)(
  145.                            ClientData clientData, 
  146.                            Proc_CallInfo *callInfoPtr), 
  147.                 ClientData clientData, unsigned int interval));
  148. extern ClientData     Proc_CallFuncAbsTime _ARGS_((void (*func)(
  149.                            ClientData clientData, 
  150.                            Proc_CallInfo *callInfoPtr), 
  151.                 ClientData clientData, Timer_Ticks time));
  152. extern void         Proc_CancelCallFunc _ARGS_((ClientData token));
  153. extern    ReturnStatus    Proc_Debug _ARGS_((Proc_PID pid, 
  154.                 Proc_DebugReq request, int numBytes,
  155.                 Address srcAddr, Address destAddr));
  156. extern    void        Proc_DestroyMigratedProc _ARGS_((ClientData pidData,
  157.                 Proc_CallInfo *callInfoPtr));
  158. extern ReturnStatus     Proc_Detach _ARGS_((int status));
  159. extern void         Proc_DetachInt _ARGS_((register 
  160.                 Proc_ControlBlock *procPtr));
  161. extern    ReturnStatus    Proc_DoForEveryProc _ARGS_((Boolean (*booleanFuncPtr)
  162.                         (Proc_ControlBlock *pcbPtr),
  163.                 ReturnStatus (*actionFuncPtr)(Proc_PID pid), 
  164.                 Boolean ignoreStatus, int *numMatchedPtr));
  165. extern ReturnStatus     Proc_DoRemoteCall _ARGS_((int callNumber, int numWords,
  166.                 ClientData *argsPtr, Sys_CallParam *specsPtr));
  167. extern    ReturnStatus    Proc_Dump _ARGS_((void));
  168. extern    void        Proc_DumpPCB _ARGS_((Proc_ControlBlock *procPtr));
  169. extern    ReturnStatus    Proc_EvictForeignProcs _ARGS_((void));
  170. extern    ReturnStatus    Proc_EvictProc _ARGS_((Proc_PID pid));
  171. extern    int        Proc_Exec _ARGS_((char *fileName, 
  172.                 char **argsPtrArray, char **envPtrArray,
  173.                 Boolean debugMe, int host));
  174. extern int         Proc_ExecEnv _ARGS_((char *fileName, 
  175.                 char **argPtrArray, char **envPtrArray, 
  176.                 Boolean debugMe));
  177. extern void         Proc_Exit _ARGS_((int status));
  178. extern void         Proc_ExitInt _ARGS_((int reason, int status, int code));
  179. extern    void        Proc_FlagMigration _ARGS_((Proc_ControlBlock *procPtr,
  180.                 int hostID, Boolean exec));
  181. extern    int        Proc_Fork _ARGS_((Boolean shareHeap, Proc_PID *pidPtr));
  182. extern    void        Proc_VforkWakeup _ARGS_((Proc_ControlBlock *procPtr));
  183. extern    int        Proc_Vfork _ARGS_(());
  184. extern    Proc_ControlBlock *Proc_GetEffectiveProc _ARGS_((void));
  185. extern    ReturnStatus    Proc_GetFamilyID _ARGS_((Proc_PID pid,
  186.                 Proc_PID *familyIDPtr));
  187. extern    ReturnStatus    Proc_GetGroupIDs _ARGS_((int numGIDs, int *gidArrayPtr,
  188.                 int *trueNumGIDsPtr));
  189. extern    ReturnStatus    Proc_GetHostIDs _ARGS_((int *virtualHostPtr, 
  190.                 int *physicalHostPtr));
  191. extern    ReturnStatus    Proc_GetIDs _ARGS_((Proc_PID *procIDPtr,
  192.                 Proc_PID *parentIDPtr, int *userIDPtr,
  193.                 int *effUserIDPtr));
  194. extern    ReturnStatus    Proc_GetIntervalTimer _ARGS_((int timerType,
  195.                 Proc_TimerInterval *userTimerPtr));
  196. extern    ReturnStatus    Proc_GetPCBInfo _ARGS_((Proc_PID firstPid,
  197.                 Proc_PID lastPid, int hostID, int infoSize,
  198.                 Address bufferPtr, Proc_PCBArgString *argsPtr,
  199.                 int *trueNumBuffersPtr));
  200. extern    ReturnStatus    Proc_GetPriority _ARGS_((Proc_PID pid, 
  201.                 int *priorityPtr));
  202. extern    ReturnStatus    Proc_GetRemoteSegInfo _ARGS_((int hostID, int segNum,
  203.                 Vm_SegmentInfo *segInfoPtr));
  204. extern    ReturnStatus    Proc_GetResUsage _ARGS_((Proc_PID pid, 
  205.                 Proc_ResUsage *bufferPtr));
  206. extern    Boolean        Proc_HasPermission _ARGS_((int userID));
  207. extern void         Proc_InformParent _ARGS_((register 
  208.                 Proc_ControlBlock *procPtr, int childStatus));
  209. extern void         Proc_Init _ARGS_((void));
  210. extern    void        Proc_InitMainEnviron _ARGS_((
  211.                 Proc_ControlBlock *procPtr));
  212. extern void         Proc_InitMainProc _ARGS_((void));
  213. extern    Boolean        Proc_IsEvictable _ARGS_((Proc_ControlBlock *procPtr));
  214. extern    int        Proc_KillAllProcesses _ARGS_((Boolean userProcsOnly));
  215. extern    void        Proc_KDump _ARGS_((ClientData dummy));
  216. extern    void        Proc_Lock _ARGS_((Proc_ControlBlock *procPtr));
  217. extern ReturnStatus     Proc_LockFamily _ARGS_((int familyID, 
  218.                 List_Links **familyListPtr, int *userIDPtr));
  219. extern    Proc_ControlBlock *Proc_LockPID _ARGS_((Proc_PID pid));
  220. extern ReturnStatus     Proc_MakeStringAccessible _ARGS_((int maxLength,
  221.                 char **stringPtrPtr, int *accessLengthPtr,
  222.                 int *newLengthPtr));
  223. extern void         Proc_MakeUnaccessible _ARGS_((Address addr, 
  224.                 int numBytes));
  225. extern    void        Proc_MigAddToCounter _ARGS_((int value, 
  226.                 unsigned int *intPtr, 
  227.                 unsigned int *squaredPtr));
  228. extern    ReturnStatus    Proc_MigGetStats _ARGS_((Address addr));
  229. extern    void        Proc_MigInit _ARGS_((void));
  230. extern    ReturnStatus    Proc_Migrate _ARGS_((Proc_PID pid, int hostID));
  231. extern    void        Proc_MigrateStartTracing _ARGS_((void));
  232. extern    void        Proc_MigrateTrap _ARGS_((Proc_ControlBlock *procPtr));
  233. extern    ReturnStatus    Proc_MigResetStats _ARGS_((void));
  234. extern ReturnStatus    Proc_MigUpdateInfo _ARGS_((Proc_ControlBlock *procPtr));
  235. extern    void        Proc_NeverMigrate _ARGS_((Proc_ControlBlock *procPtr));
  236. extern ReturnStatus    Proc_NewProc _ARGS_((Address PC, int procType,
  237.                 Boolean shareHeap, Proc_PID *pidPtr,
  238.                 char *procName, Boolean shareAllSegs));
  239. extern    void        Proc_NotifyMigratedWaiters _ARGS_((ClientData data,
  240.                 Proc_CallInfo *callInfoPtr));
  241. extern    ReturnStatus    Proc_Profile _ARGS_((int shiftSize, int lowPC,
  242.                 int highPC, Time interval, int counterArray[]));
  243. extern    void        Proc_PushLockStack _ARGS_((Proc_ControlBlock *pcbPtr,
  244.                 int type, Address lockPtr));
  245. extern void         Proc_Reaper _ARGS_((ClientData data,
  246.                 Proc_CallInfo *callInfoPtr));
  247. extern void        Proc_ResumeProcess _ARGS_((Proc_ControlBlock *procPtr,
  248.                 Boolean killingProc));
  249. extern    ReturnStatus    Proc_RemoteDummy _ARGS_((int callNumber, 
  250.                 int numWords, Sys_ArgArray *argsPtr,
  251.                 Sys_CallParam *specsPtr));
  252. extern int         Proc_RemoteExec _ARGS_((char *fileName, 
  253.                 char **argPtrArray,char **envPtrArray, 
  254.                 int host));
  255. extern    void        Proc_RemoveFromLockStack _ARGS_((
  256.                 Proc_ControlBlock *pcbPtr, Address lockPtr));
  257. extern    void        Proc_ResumeMigProc _ARGS_((int pc));
  258. extern    ReturnStatus    Proc_RpcGetPCB _ARGS_((ClientData srvToken,
  259.                 int clientID, int command,
  260.                 Rpc_Storage *storagePtr));
  261. extern    ReturnStatus    Proc_RpcMigCommand _ARGS_((ClientData srvToken,
  262.                 int hostID, int command, 
  263.                 Rpc_Storage *storagePtr));
  264. extern    ReturnStatus    Proc_RpcRemoteCall _ARGS_((ClientData srvToken,
  265.                 int clientID, int command, 
  266.                 Rpc_Storage *storagePtr));
  267. extern ReturnStatus     Proc_RpcRemoteWait _ARGS_((ClientData srvToken,
  268.                 int clientID, int command, 
  269.                 Rpc_Storage *storagePtr));
  270. extern void        Proc_UnlockAndSwitch _ARGS_((
  271.                 Proc_ControlBlock *procPtr,
  272.                 Proc_State state));
  273. extern void         Proc_UnlockFamily _ARGS_((int familyID));
  274. extern void         Proc_ServerInit _ARGS_((void));
  275. extern void         Proc_ServerProc _ARGS_((void));
  276. extern    void        Proc_SetEffectiveProc _ARGS_((
  277.                 Proc_ControlBlock *procPtr));
  278. extern    ReturnStatus    Proc_SetFamilyID _ARGS_((Proc_PID pid, 
  279.                 Proc_PID familyID));
  280. extern    ReturnStatus    Proc_SetGroupIDs _ARGS_((int numGIDs, 
  281.                 int *gidArrayPtr));
  282. extern    ReturnStatus    Proc_SetIDs _ARGS_((int userID, int effUserID));
  283. extern    ReturnStatus    Proc_SetIntervalTimer _ARGS_((int timerType,
  284.                 Proc_TimerInterval *newTimerPtr,
  285.                 Proc_TimerInterval *oldTimerPtr));
  286. extern    ReturnStatus    Proc_SetPriority _ARGS_((Proc_PID pid, int priority,
  287.                 Boolean useFamily));
  288. extern    void        Proc_SetServerPriority _ARGS_((Proc_PID pid));
  289. extern    void        Proc_SetupEnviron _ARGS_((Proc_ControlBlock *procPtr));
  290. extern    ReturnStatus    Proc_StringNCopy _ARGS_((int numBytes, char *srcStr,
  291.                 char *destStr, int *strLengthPtr));
  292. extern    void        Proc_SuspendProcess _ARGS_((
  293.                 Proc_ControlBlock *procPtr, Boolean debug,
  294.                 int termReason, int termStatus, 
  295.                 int termCode));
  296. extern    void        Proc_Unlock _ARGS_((Proc_ControlBlock *procPtr));
  297. extern    ReturnStatus    Proc_Wait _ARGS_((int numPids, Proc_PID pidArray[],
  298.                 int flags, Proc_PID *procIDPtr, 
  299.                 int *reasonPtr, int *statusPtr, 
  300.                 int *subStatusPtr, Proc_ResUsage *usagePtr));
  301. extern    ReturnStatus    Proc_WaitForHost _ARGS_((int hostID));
  302. extern    ReturnStatus    Proc_WaitForMigration _ARGS_((Proc_PID processID));
  303. extern    void        Proc_WakeupAllProcesses _ARGS_((void));
  304. extern    int        Proc_ServerProcCreate _ARGS_((int numToCreate));
  305. extern    int        proc_NumServers;
  306. /*
  307.  * The following are kernel stubs corresponding to system calls.  They
  308.  * used to be known by the same name as the system call, but the C library
  309.  * has replaced them at user level in order to use the stack environments.
  310.  * The "Stub" suffix therefore avoids naming conflicts with the library.
  311.  */
  312.  
  313. extern    ReturnStatus    Proc_SetEnvironStub _ARGS_((
  314.                 Proc_EnvironVar environVar));
  315. extern    ReturnStatus    Proc_UnsetEnvironStub _ARGS_((
  316.                 Proc_EnvironVar environVar));
  317. extern    ReturnStatus    Proc_GetEnvironVarStub _ARGS_((
  318.                 Proc_EnvironVar environVar));
  319. extern    ReturnStatus    Proc_GetEnvironRangeStub _ARGS_((int first, int last,
  320.                 Proc_EnvironVar *envArray, 
  321.                 int *numActualVarsPtr));
  322. extern    ReturnStatus    Proc_CopyEnvironStub _ARGS_((void));
  323. extern    ReturnStatus    Proc_InstallEnvironRangeStub _ARGS_((
  324.                 Proc_EnvironVar environVar, int numVars));
  325. extern     int         Proc_KernExec _ARGS_((char *fileName, 
  326.                 char **argPtrArray));
  327.  
  328. #endif /* _PROC */
  329.